package JUC.死锁;

import java.util.concurrent.TimeUnit;


/**
 * @author CKC
 * @DateTime 2021/4/2 21:12
 * 死锁是指两个或两个以上的进程在执行过程中，
 * 因争夺资源造成的一种相互等待的现象，
 * 若无外力的干涉，那他们都将无法推进下去。
 */
public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";
        new Thread(new HoldLockThread(lockA,lockB),"AAA").start();
        new Thread(new HoldLockThread(lockB,lockA),"BBB").start();
        
        /**
         * linux  ps -ef|grep xxx     ls -l
         * windows下的Java运行程序也有类似的ps的查看进程的命令，但是目前我们需要查看的只是Java
         * * jdk-11.0.9\bin目录下
         *      jps=java ps            jps -l
         *      jps是jdk提供的一个查看当前java进程的小工具
         *        * -q：仅输出VM标识符，不包括classname,jar name,arguments in main method
         *        * -m：输出main method的参数
         *        * -l：输出完全的包名，应用主类名，jar的完全路径名
         *        * -v：输出jvm参数
         *        * -V：输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
         *        * -Joption：传递参数到vm,例如:-J-Xms512m
         * jstack PID  打印堆栈信息
         */
    }
}

class HoldLockThread implements Runnable {
    private String lockA;
    private String lockB;
    
    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }
    
    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockA + "锁\t 尝试获得：" + lockB + "锁");
            try { TimeUnit.SECONDS.sleep(1); }catch (InterruptedException e){ e.printStackTrace(); }
            synchronized (lockB){
                System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockB + "锁\t 尝试获得：" + lockA + "锁");
            }
        }
        
    }
}